package com.xzc.jcip._4_.对象的组合.对象的域审视;

import net.jcip.annotations.GuardedBy;
import net.jcip.annotations.ThreadSafe;

/**
 * 要审视其域是基本类型还是引用
 * 是否可变，所有可变的地方是否都纳入了管理中
 * 为了不对每次内存访问进行审查，采用封装审查的方式
 * 封装好了，内存访问也就安全了
 * 将第3章学的安全套路组合起来形成新的套路
 *
 * --监视器模式
 */
@ThreadSafe
public final class Counter {
    @GuardedBy("this")
    private long value = 0;

    public synchronized long getValue() {
        return value;
    }

    public synchronized long increment() {
        if (value == Long.MAX_VALUE)
            throw new IllegalStateException("counter overflow");
        return ++value;
    }
}
